昨天我們步驟講到一半,提到透過兩個container,也就是flask以及nginx,接著同樣設定volume將nginx log往外拋,並且在本機透過filebeat去蒐集log並進行上傳。今天我們基於昨天的步驟,以及設定檔,詳細講解如何運作,以及nginx log的一些測試。
首先我們先檢視一下這個專案,整體資料夾及檔案的架構:
│ docker-compose.yml
│
├─filebeat
├─flask
│ Dockerfile
│ main.py
│ requirements.txt
│ wsgi.ini
│
├─nginx
│ Dockerfile
│ nginx.conf
│
└─nginx-logs
access.log
error.log
可以看到,最外層包含四個資料夾,分別是flask, nginx, filebeat, nginx-logs,以及一個檔案 docker-compose.yml
首先這四個資料夾,分別是這次我們會用到的兩個服務:flask、nginx的container folder,另外還有明天會講解到開啟filebeat container的部分,以及蒐集log往外拋的連接volume資料夾nginx-logs
docker-compose.yml檔案則是docker-compose設定不同container的設定檔,昨天講到裡面會包含不同container的設定,以及之間的交互關係。
docker-compose.yml
services:
flask:
build: ./flask
container_name: template_flask
# restart: always
environment:
- APP_NAME=FlaskApp
expose:
- 8080
nginx:
build: ./nginx
volumes:
- "/c/Users/user/flask-nginx-elk-demo/nginx-logs:/var/log/nginx"
container_name: template_nginx
# restart: always
ports:
- "80:80"
depends_on:
- flask
可以看到nginx的container必須depends_on flask,這代表我們會先啟動flask的container,再啟動nginx的container。
其中flask資料夾中需要的東西如下:
DockerFile
FROM python:3.7.2-stretch
WORKDIR /app
ADD . /app
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
CMD ["uwsgi", "wsgi.ini"]
main.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello World!"
if __name__ == '__main__':
app.run()
requirements.txt
Flask==1.1.1
Flask-Cors==3.0.8
uWSGI==2.0.18
wsgi.ini
[uwsgi]
wsgi-file = main.py
callable = app
socket = :8080
processes = 4
threads = 2
master = true
chmod-socket = 660
vacuum = true
die-on-term = true
這邊簡單講解一下每個用途,首先DockerFile當然是建構flask container的主要流程,主要就是透過python的image去啟動,並且先進入app/ folder,將本機上面這些檔案複製上去,並且install 必要的package,接著就透過uwsgi去啟動服務。
因此後面三個,main.py就是flask主程式;requirements.txt就是需要套件;wsgi.ini就是uwsgi的設定,像是我們將socker設8080,並且將socket的權限開放,以及對照到flask的主程式等等。
所以這邊這個container起起來後,就會是uwsgi啟動flask服務的狀態。
接著我們討論到另一個nginx,裡面架構更簡單,主要就是DockerFile以及一個nginx的設定檔,如下:
DockerFile
# Use the Nginx image
FROM nginx
# Remove the default nginx.conf
RUN rm /etc/nginx/conf.d/default.conf
# Replace with our own nginx.conf
COPY nginx.conf /etc/nginx/conf.d/
nginx.conf
server {
listen 80;
# server_name 0.0.0.0;
location / {
include uwsgi_params;
uwsgi_pass flask:8080;
}
}
這邊昨天大致上有提到,其實就是把設定檔蓋過去,這邊也可以看到我們nginx conf中,關於uwsgi_pass的設定,就是flask的8080port,並且對外透過80 port出去。
將這些東西都準備好後,其實就是在最外層目錄,docker-compose.yml同層下,輸入docker-compose up
第一次你會看到他會分別建構這兩個container,運作好以後就會進入Listen狀態,如此一來就成功啟動這兩者。
而你可以同樣拜訪127.0.0.1(docker tool box:192.168.99.100),就會看到頁面是剛剛flask設定的endpoint,return回Hello!
接著檢視log資料夾,也會看到有log進去了!
而這時候搭配先前提到的filebeat監聽,就可以有效地蒐集了。
今天大致上我們將這個流程操作起來,明天我們會提到,如何去測試nginx log,以及在同時在docker-compose下,將filebeat起起來,可以先想一下,這樣的差別跟我們把filebeat架在本機端有什麼差別?